home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / modules / nessus-2.2.8.mo / usr / bin / nessus-mkcert-client < prev    next >
Text File  |  2006-06-13  |  12KB  |  438 lines

  1. #!/bin/sh
  2. #
  3. # nessus-mkcert-client
  4. #
  5. # Written by Michel Arboi <arboi@alussinan.org> from nessus-mkcert
  6. #
  7. # This script is distributed under the Gnu General Public License (GPL)
  8. #
  9.  
  10. case `echo -n` in
  11. \-n)    Xn=   ; Xc='\c' ;;
  12. *)    Xn=-n ; Xc=
  13. esac
  14.  
  15.  
  16. echo_no_nl ()
  17. {
  18.     echo $Xn "$*$Xc"
  19. }
  20.  
  21.  
  22. header()
  23. {
  24. clear
  25. echo "-------------------------------------------------------------------------------"
  26. echo "            Creation Nessus SSL client Certificate"
  27. echo "-------------------------------------------------------------------------------"
  28. echo
  29. }
  30. #
  31. umask 022
  32.  
  33. prefix=/usr
  34. datadir=/usr/share
  35. sysconfdir=/etc
  36. localstatedir=/var/lib
  37. sharedstatedir=${prefix}/com
  38. sbindir=${prefix}/sbin
  39. bindir=${prefix}/bin
  40. egdpath=
  41. is_cygwin=
  42.  
  43. RANDFLAG=""
  44. test -n "$egdpath" && 
  45. {
  46.  RANDFLAG="-rand $egdpath"
  47. }
  48.  
  49. PATH=$PATH:$sbindir:$bindir:/usr/ssl/bin:/usr/local/ssl/bin:/opt/ssl/bin
  50.  
  51. #
  52. # We need openssl
  53. #
  54. case `openssl version` in 
  55.  OpenSSL*)
  56.      ;;
  57.  *)
  58.    echo "OpenSSL is not properly installed (the 'openssl' command line utility could not"
  59.    echo "be found (is your \$PATH set properly ?)"
  60.    exit 1
  61. esac
  62.      
  63. # Check environment
  64. if [ -z "$HOME" ]; then
  65.     echo "HOME should be defined" 1>&2; exit 1
  66. fi
  67.  
  68. #
  69. # If EGD is not installed, we have to rely on other sources
  70. # of entropy
  71. test -z "$RANDFLAG" -a -z "$RANDFILE" &&
  72. {
  73.  if [ ! -r /dev/random -a ! -r /dev/urandom -a ! -r $HOME/.rnd ];
  74.   then
  75.    header
  76.    echo "You do not have any suitable random source"
  77.    echo "You will be asked to type a few random keys on your keyboard"
  78.    echo "to generate random bytes"
  79.    nessus-mkrand $HOME/.rnd 1024 
  80.    echo "Press [ENTER] to continue..."
  81.   fi
  82. }
  83.  
  84.  
  85.  
  86. NESSUSPRIV="$localstatedir/nessus/CA"
  87. NESSUSPUB="$sharedstatedir/nessus/CA"
  88.  
  89. while [ ! -d "$NESSUSPRIV" ]; do
  90.     echo_no_nl "Nessus server 'private' directory: "
  91.     read NESSUSPRIV
  92. done
  93.  
  94. while [ ! -d "$NESSUSPUB" ]; do
  95.     echo_no_nl "Nessus server 'public' directory: "
  96.     read NESSUSPUB
  97. done
  98.  
  99. CAKEY=$NESSUSPRIV/cakey.pem
  100. CACERT=$NESSUSPUB/cacert.pem
  101.  
  102. while [ ! -f "$CAKEY" ]; do
  103.     echo "$CAKEY: not found or not a file"
  104.     echo_no_nl "Nessus CA private key: "
  105.     read CAKEY
  106. done
  107.  
  108. while [ ! -f "$CACERT" ]; do
  109.     echo "$CACERT: not found or not a file"
  110.     echo_no_nl "Nessus CA certificate: "
  111.     read CACERT
  112. done
  113.  
  114. for F in "$CAKEY" "$CACERT"; do 
  115.     if [ ! -r "$F" ]; then
  116.     echo "Cannot read $F" 1>&2; exit 1
  117.     fi
  118. done
  119.  
  120. R=x
  121. while [ "$R" != "y" -a "$R" != "n" ]; do
  122.     echo "Do you want to register the users in the Nessus server "
  123.     echo_no_nl "as soon as you create their certificates ? (y/n): "
  124.     read R
  125. done
  126.  
  127. if [ "$R" = "y" ]; then
  128.     USERSDIR=$localstatedir/nessus/users
  129.     while [ ! -d "$USERSDIR" ]; do
  130.     echo "$USERSDIR: not a directory"
  131.     echo_no_nl "Users directory? "
  132.     read USERSDIR
  133.     done
  134. else
  135.     USERSDIR=""
  136. fi
  137.  
  138. umask 066
  139.  
  140. # Set environment
  141. BASEDIR=${TMPDIR-/tmp}/nessus-mkcert.$$
  142. mkdir $BASEDIR || exit 1
  143.  
  144.  
  145. echo "This script will now ask you the relevant information to create the SSL"
  146. echo "client certificates for Nessus."
  147.  
  148. echo_no_nl "Client certificates life time in days [365]:"; read x
  149. DFL_CERT_LIFETIME=${x:-365}
  150.  
  151. # Default country = France - Too bad for you, but quicker for my tests!
  152. if [ ! -z "$LANG" ]; then
  153.     DC=`echo $LANG | sed -n 's/^..*_\(..\)$/\1/p'`
  154. fi
  155. echo_no_nl "Your country (two letter code) [${DC:=FR}]: "; read x
  156. DFL_COUNTRY=${x:-$DC}
  157. echo_no_nl "Your state or province name [none]: "; read DFL_PROVINCE
  158. X=Paris; echo_no_nl "Your location (e.g. town) [$X]: "; read x
  159. DFL_LOCATION=${x:-$X}
  160. echo_no_nl "Your organization [none]: "; read DFL_ORGANIZATION
  161. echo_no_nl "Your organizational unit [none]:"; read DFL_ORGUNIT
  162.  
  163. #
  164.  
  165. cat <<EOF>$BASEDIR/stdC.cnf
  166. RANDFILE        = $HOME/.rnd
  167. #
  168. [ ca ]
  169. default_ca = NessusCA
  170.  
  171. [ NessusCA ]
  172. dir        = $BASEDIR        # Where everything is kept
  173. certs        = \$dir            # Where the issued certs are kept
  174. crl_dir        = \$dir            # Where the issued crl are kept
  175. database    = \$dir/index.txt    # database index file.
  176. new_certs_dir    = \$dir            # default place for new certs.
  177.  
  178. certificate    = $CACERT         # The CA certificate
  179. serial        = \$dir/serial         # The current serial number
  180. crl        = \$dir/crl.pem     # The current CRL
  181. private_key    = $CAKEY        # The private key
  182.  
  183. x509_extensions    = usr_cert        # The extentions to add to the cert
  184. crl_extensions    = crl_ext
  185.  
  186. default_days    = 365        # how long to certify for
  187. default_crl_days= 30            # how long before next CRL
  188. default_md    = md5            # which md to use.
  189. preserve    = no            # keep passed DN ordering
  190.  
  191. policy        = policy_anything
  192.  
  193. [ policy_anything ]
  194. countryName             = optional
  195. stateOrProvinceName     = optional
  196. localityName            = optional
  197. organizationName        = optional
  198. organizationalUnitName  = optional
  199. commonName              = supplied
  200. emailAddress            = optional
  201.  
  202. [ req ]
  203. default_bits        = 1024
  204. distinguished_name    = req_distinguished_name
  205. # attributes        = req_attributes
  206. x509_extensions    = v3_ca    # The extentions to add to the self signed cert
  207.  
  208. [ req_distinguished_name ]
  209. countryName            = Country Name (2 letter code)
  210. countryName_default        = FR
  211. countryName_min            = 2
  212. countryName_max            = 2
  213.  
  214. stateOrProvinceName        = State or Province Name (full name)
  215. stateOrProvinceName_default    = Some-State
  216.  
  217. localityName            = Locality Name (eg, city)
  218.  
  219. 0.organizationName        = Organization Name (eg, company)
  220. 0.organizationName_default    = Internet Widgits Pty Ltd
  221.  
  222. # we can do this but it is not needed normally :-)
  223. #1.organizationName        = Second Organization Name (eg, company)
  224. #1.organizationName_default    = World Wide Web Pty Ltd
  225.  
  226. organizationalUnitName        = Organizational Unit Name (eg, section)
  227. #organizationalUnitName_default    =
  228.  
  229. commonName            = Common Name (eg, your name or your server\'s hostname)
  230. commonName_max            = 64
  231.  
  232. emailAddress            = Email Address
  233. emailAddress_max        = 40
  234.  
  235. # SET-ex3            = SET extension number 3
  236.  
  237. [ usr_cert ]
  238. # These extensions are added when 'ca' signs a request.
  239. # This goes against PKIX guidelines but some CAs do it and some software
  240. # requires this to avoid interpreting an end user certificate as a CA.
  241. #basicConstraints=CA:FALSE
  242.  
  243. # Here are some examples of the usage of nsCertType. If it is omitted
  244. # the certificate can be used for anything *except* object signing.
  245.  
  246. # This is OK for an SSL server.
  247. # nsCertType            = nsCertType
  248. # For normal client use this is typical
  249. # nsCertType = client, email
  250. nsCertType            = client
  251.  
  252. keyUsage = nonRepudiation, digitalSignature, keyEncipherment
  253.  
  254. # This will be displayed in Netscape's comment listbox.
  255. nsComment            = "OpenSSL Generated Certificate"
  256.  
  257. # PKIX recommendations harmless if included in all certificates.
  258. subjectKeyIdentifier=hash
  259. authorityKeyIdentifier=keyid,issuer:always
  260.  
  261. # This stuff is for subjectAltName and issuerAltname.
  262. # Import the email address.
  263. subjectAltName=email:copy
  264.  
  265. # Copy subject details
  266. issuerAltName=issuer:copy
  267.  
  268. #nsCaRevocationUrl        = http://www.domain.dom/ca-crl.pem
  269. #nsBaseUrl
  270. #nsRevocationUrl
  271. #nsRenewalUrl
  272. #nsCaPolicyUrl
  273. #nsSslServerName
  274.  
  275. [ v3_ca ]
  276. # PKIX recommendation.
  277. subjectKeyIdentifier=hash
  278. authorityKeyIdentifier=keyid:always,issuer:always
  279.  
  280. # This is what PKIX recommends but some broken software chokes on critical
  281. # extensions.
  282. basicConstraints = critical,CA:true
  283. # So we do this instead.
  284. #basicConstraints = CA:true
  285.  
  286. # Key usage: this is typical for a CA certificate. However since it will
  287. # prevent it being used as an test self-signed certificate it is best
  288. # left out by default.
  289. keyUsage = cRLSign, keyCertSign
  290. nsCertType = sslCA
  291. EOF
  292.  
  293. #
  294. echo 01 > $BASEDIR/serial
  295. touch $BASEDIR/index.txt
  296.  
  297. echo "**********
  298. We are going to ask you some question for each client certificate
  299. If some question has a default answer, you can force an empty answer by 
  300. entering a single dot '.'
  301. *********"
  302.  
  303.  
  304. I=1; ANOTHER=y
  305.  
  306. while [ "$ANOTHER" != "n" ]; do
  307.     PSEUDO=""
  308.     while [ -z "$PSEUDO" ]; do
  309.     echo_no_nl "User #$I name (e.g. Nessus username): "
  310.     read PSEUDO
  311.     CERTFILE="$BASEDIR/cert_$PSEUDO.pem"
  312.     KEYFILE="$BASEDIR/key_$PSEUDO.pem"
  313.     REQFILE="$BASEDIR/req_$PSEUDO.pem"
  314.     DNFILE="$USERSDIR/$PSEUDO/auth/dname" # Not wise if USERSDIR is not set
  315.     if [ -f "$CERTFILE" -o -f "$KEYFILE" -o -f "$DNFILE" ]; then
  316.         A=""
  317.         while [ -z "$A" ]; do
  318.         echo "Certificate, key or Nessus DN file(s) already exist."
  319.         echo_no_nl "Do you want to go on and overwite it/them? "
  320.         read A
  321.         if [ "$A" = "n" ]; then PSEUDO=""; fi
  322.         done
  323.     fi
  324.     done
  325.  
  326.     echo_no_nl "Client certificates life time in days [$DFL_CERT_LIFETIME]:"
  327.     read x
  328.     CERT_LIFETIME=${x:-$DFL_CERT_LIFETIME}
  329.     echo_no_nl "Country (two letter code) [$DFL_COUNTRY]: "; read x
  330.     COUNTRY=${x:-$DFL_COUNTRY}
  331.     echo_no_nl "State or province name [$DFL_PROVINCE]: "; read x
  332.     PROVINCE=${x:-$DFL_PROVINCE}
  333.     echo_no_nl "Location (e.g. town) [$DFL_LOCATION]: "; read x
  334.     LOCATION=${x:-$DFL_LOCATION}
  335.     echo_no_nl "Organization [$DFL_ORGANIZATION]: "; read x
  336.     ORGANIZATION=${x:-$DFL_ORGANIZATION}
  337.     echo_no_nl "Organization unit [$DFL_ORGUNIT]: "; read x
  338.     ORGUNIT=${x:-$DFL_ORGUNIT}
  339.     echo_no_nl "e-mail []: "; read EMAIL
  340.  
  341.     # Client key
  342.     openssl genrsa -out $KEYFILE 1024
  343.  
  344.     # Client certificate "request"
  345. echo "${COUNTRY:-.}
  346. ${PROVINCE:-.}
  347. ${LOCATION:-.}
  348. ${ORGANIZATION:-.}
  349. ${ORGUNIT:-.}
  350. $PSEUDO
  351. ${EMAIL:-.}" | 
  352.     openssl req -config $BASEDIR/stdC.cnf -new -key $KEYFILE -out $REQFILE
  353.  
  354.     # Sign the client certificate
  355.     openssl ca -config $BASEDIR/stdC.cnf -name NessusCA -batch -days $CERT_LIFETIME -in $REQFILE -out $CERTFILE
  356.  
  357.     # Create export file for NessusWX
  358.     NWX_CERTFILE=$BASEDIR/cert_nessuswx_$PSEUDO.pem
  359.     cp $CERTFILE $NWX_CERTFILE
  360.     cat $KEYFILE >> $NWX_CERTFILE
  361.  
  362.     chmod a+r $CERTFILE
  363.     chmod a+r $NWX_CERTFILE
  364.  
  365.     if [ ! -z "$USERSDIR" ]; then
  366.  
  367.         # 
  368.         # create the auth dir, which contains the user rules, 
  369.         # password or cert, and plugin acl 
  370.     D="$USERSDIR/$PSEUDO/auth"
  371.     if [ ! -d "$D" ]; then
  372.         mkdir -p "$D"
  373.         chmod 700 "$D"
  374.     fi
  375.  
  376.         # 
  377.         # create the user auth/rules file 
  378.       # 
  379.       R="$USERSDIR/$PSEUDO/auth/rules" 
  380.       echo 
  381.       echo "User rules" 
  382.       echo "----------" 
  383.       echo "nessusd has a rules system which allows you to restrict the hosts" 
  384.       echo "that $login has the right to test. For instance, you may want" 
  385.       echo "him to be able to scan his own host only." 
  386.       echo 
  387.       echo "Please see the nessus-adduser(8) man page for the rules syntax" 
  388.       echo 
  389.       echo "Enter the rules for this user, and hit ctrl-D once you are done: " 
  390.  
  391.  
  392.       echo "(the user can have an empty rules set)" 
  393.       cat > $TMPDIR/rules.$$ || { 
  394.               echo "Error - could not write $TMPDIR/rules.$$" 
  395.               exit 1 
  396.       } 
  397.       cp $TMPDIR/rules.$$ "$USERSDIR/$PSEUDO/auth/rules" 
  398.  
  399.       rm $TMPDIR/rules.$$ 
  400.  
  401.       # 
  402.       # create the cert authentication file auth/dname 
  403.       # 
  404.     > $DNFILE
  405.     [ ! -z "$COUNTRY" -a "$COUNTRY" != "." ] &&
  406.         echo_no_nl "/C=$COUNTRY" >> $DNFILE
  407.     [ ! -z "$PROVINCE" -a "$PROVINCE" != "." ] &&
  408.         echo_no_nl "/ST=$PROVINCE" >> $DNFILE
  409.     [ ! -z "$LOCATION" -a "$LOCATION" != "." ] &&
  410.         echo_no_nl "/L=$LOCATION" >> $DNFILE
  411.     [ ! -z "$ORGANIZATION" -a "$ORGANIZATION" != "." ] && 
  412.         echo_no_nl "/O=$ORGANIZATION" >> $DNFILE
  413.     [ ! -z "$ORGUNIT" -a "$ORGUNIT" != "." ] && 
  414.         echo_no_nl "/OU=$ORGUNIT" >> $DNFILE
  415.     echo_no_nl "/CN=$PSEUDO" >> $DNFILE
  416.     [ ! -z "$EMAIL" ] && echo_no_nl "/emailAddress=$EMAIL" >> $DNFILE
  417.  
  418.       # 
  419.         # create the plugins dir, which contains the user plugins 
  420.         # 
  421.         E="$USERSDIR/$PSEUDO/plugins" 
  422.         if [ ! -d "$E" ]; then 
  423.             mkdir -p "$E" 
  424.             chmod 700 "$E" 
  425.         fi 
  426.         echo "User added to Nessus." 
  427.     fi
  428.  
  429.     echo_no_nl "Another client certificate? " 
  430.     read ANOTHER 
  431.     I=`expr $I + 1` 
  432. done
  433.  
  434. echo "Your client certificates are in $BASEDIR
  435. You will have to copy them by hand"
  436.  
  437.